package com.longtop.framework.sys.role.web;

import java.util.Map;

import com.longtop.framework.base.BaseAction;
import com.longtop.framework.common.QueryConditions;
import com.longtop.framework.common.QueryResult;
import com.longtop.framework.security.BaseCheckedException;
import com.longtop.framework.security.SessionObject;
import com.longtop.framework.sys.role.model.TSysRole;
import com.longtop.framework.sys.role.service.RoleService;
import com.longtop.framework.util.BeanUtil;
import com.longtop.framework.util.WebUtil;
import com.longtop.intelliweb.action.IActionContext;
import com.longtop.intelliweb.action.IInitContext;
import com.longtop.intelliweb.view.Dataset;

/**
 * 
 * @author 胡砥峰
 * 
 */
public class RoleListAction extends BaseAction {

	private final static String DATASET_ROLE = "Dataset_Role";

	/**
	 * 系统共用：初始化调用
	 */
	public void init(IInitContext context) {
		super.init(context);
	}

	/**
	 * 本页jsp：初始化业务数据(覆写父类方法)
	 */
	public void thisPageInit(IInitContext context) {
		// 调用公用查询方法
		commonQuery(context, false);
	}

	/**
	 * 自定义查询
	 * 
	 * @param context
	 */
	public void searchRole(IActionContext context) {

		// 调用公用查询方法
		commonQuery(context, true);
	}

	/**
	 * 执行翻页查询
	 * 
	 * @param context
	 */
	public void loadRole(IActionContext context) {

		// 调用公用查询方法
		commonQuery(context, false);
	}

	/**
	 * 保存、修改、删除一起做！
	 * 
	 * @param context
	 */
	public void saveRole(IActionContext context) {

		// 获取页面上的dataset的结构
		Dataset roleDataset = context.getDataset(DATASET_ROLE);

		// 验证数据集是否存在及是否有变化
		if (!WebUtil.validateDatasetChange(this, roleDataset, DATASET_ROLE)) {
			return;
		}

		// 调用Spring的业务逻辑类
		RoleService roleService = getBean(RoleService.BEAN_ID);

		try {
			// 把dataset转成要删除的主键列表、新增bean及更新bean列表
			Map changeMap = WebUtil.datasetToObjectList(roleDataset, "roleId", TSysRole.class);

			// 获得SessionObject对象,得到用户对象
			SessionObject sessionObject = this.getSessionObject(context);

			// 调用业务逻辑层的批量更新方法(在一个事务内实现)
			Integer[] count = roleService.saveRole(changeMap, sessionObject);

			// 向JSP页面传递操作结果信息
			this.hintInfoMessage(WebUtil.getSubmitSuccessInfo(count[0].intValue(), count[1].intValue(), count[2].intValue()));
		} catch (BaseCheckedException e) {
			// 在界面显示错误信息
			this.hintErrorMessage(e.getMessage());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 通用查询.将数据查询出来，拼装数据。
	 * 
	 * @param object
	 *            IInitContext或IActionContext
	 * @param initLoad
	 *            是否是本Action的初始化方法调用！
	 */
	private void commonQuery(Object object, boolean isFirstPageNo) {

		RoleService roleService = getBean(RoleService.BEAN_ID); // 调用Spring的业务逻辑类
		QueryConditions queryConditions = WebUtil.createQueryConditions(); // 查询条件辅助类

		// 获取dataset,验证数据集对象是否存在
		Dataset dataset = this.getDataset(object, DATASET_ROLE);
		if (!WebUtil.validateDatasetExist(this, dataset, DATASET_ROLE)) {
			return;
		}

		// 判断是否是由 init方法 调用
		if (object instanceof IActionContext) {
			IActionContext context = (IActionContext) object;

			// 取得界面传入的查询条件(必须设置command的submitForm=true)
			String roleId = context.getElementValue("Text_roleId");
			String roleName = context.getElementValue("Text_roleName");
			String remark = context.getElementValue("Text_Remark");

			queryConditions.setCondition("roleId", QueryConditions.INCLUDE, roleId);
			queryConditions.setCondition("roleName", QueryConditions.INCLUDE, roleName);
			queryConditions.setCondition("remark", QueryConditions.INCLUDE, remark);
		}
		String orderBy = "sortNo asc";
		queryConditions.setOrderBy(orderBy);

		// 当前第几页
		int pageNo = 1;
		if (!isFirstPageNo)
			pageNo = dataset.getPageNo();

		// 每页多少条记录
		int pageSize = dataset.getPageSize();

		// 调用service层，依据条件查询第一页记录，并获取总页数
		QueryResult queryResult = roleService.loadByConditions(queryConditions, pageNo, pageSize, TSysRole.class);
		BeanUtil.queryResultToDataset(queryResult, dataset, false, true);

	}
}